package com.example.time.handler;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;

import java.util.Date;

/**
 * @author linfeng
 * @date 2022/1/17 14:48
 */
public class TimeClientHandler extends ChannelInboundHandlerAdapter {

    private ByteBuf buf;

    // 这是一个生命周期方法
    // 当把ChannelHandler 添加到ChannelPipeline 中时被调用
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        buf = ctx.alloc().buffer(8);
    }

    // 这是一个生命周期方法
    // 当从ChannelPipeline 中移除ChannelHandler 时被调用
    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        // 释放引用计数
        ReferenceCountUtil.release(buf);
        // 将引用置空，便于GC
        buf = null;
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf message = (ByteBuf) msg;
        buf.writeBytes(message);
        // Handler负责释放传递给它的引用计数对象
        message.release();

        // 当累积缓冲区中有足够的数据时再去解析它
        if (buf.readableBytes() >= 8) {
            long timestamp = buf.readLong();
            Date date = new Date(timestamp);
            System.out.println("时间：" + date);

            ctx.close();
        }
    }


    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }

}
